package iks.utils.geom 
{
	import flash.display.*;
	import flash.geom.*;
	
	/**
	 * 自定义矩形类, 矩形中心为坐标点
	 * @author StefanieKaka
	 */
	public final class KRectangle 
	{
		/**
		 * 获得矩形各个点的向量
		 * @param	rx x坐标
		 * @param	ry y坐标
		 * @param	rw 宽度
		 * @param	ry 高度
		 * @param	radian 矩形旋转的角度
		 * @return 各个顶点的向量
		 */
		public static function getVectors(rx : Number, ry : Number, rw : Number, rh : Number, radian : Number) : Vector.<Vector2D>
		{
			var vectors : Vector.<Vector2D> = new Vector.<Vector2D>(4, true);
			vectors[0] = new Vector2D(-rw / 2, -rh / 2);
			vectors[1] = new Vector2D(rw / 2, -rh / 2);
			vectors[2] = new Vector2D(rw / 2, rh / 2);
			vectors[3] = new Vector2D(-rw / 2, rh / 2);
			
			for each (var v : Vector2D in vectors)
			{
				v.angle += radian;
				v.x += rx;
				v.y += ry;
			}
			
			return vectors;
		}
		
		/**
		 * 从 flash 的 Rectangle 类转化成 KRectangle 类
		 * @param	source 被转化的 Rectangle 对象
		 * @return 转化的 KRectangle 对象
		 */
		public static function transFromRectangle(source : Rectangle) : KRectangle
		{
			var dest : KRectangle = new KRectangle(0, 0, source.width, source.height);
			dest.left = source.x;
			dest.top = source.y;
			return dest;
		}
		
		/**
		 * 构造函数
		 * @param	x x坐标
		 * @param	y y坐标
		 * @param	w 宽度
		 * @param	h 高度
		 */
		public function KRectangle(x : Number = 0, y : Number = 0, w : Number = 0, h : Number = 0) 
		{
			m_x = x;
			m_y = y;
			m_width = w;
			m_height = h;
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 公共类
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		/**
		 * 设置/获取x坐标
		 */
		public function get x() : Number
		{
			return m_x;
		}
		
		public function set x(value : Number) : void
		{
			m_x = value;
		}
		
		/**
		 * 设置/获取y坐标
		 */
		public function get y() : Number
		{
			return m_y;
		}
		
		public function set y(value : Number) : void
		{
			m_y = value;
		}
		
		/**
		 * 设置/获取宽度
		 */
		public function get width() : Number
		{
			return m_width;
		}
		
		public function set width(value : Number) : void
		{
			m_width = value;
		}
		
		/**
		 * 设置/获取高度
		 */
		public function get height() : Number
		{
			return m_height;
		}
		
		public function set height(value : Number) : void
		{
			m_height = value;
		}
		
		/**
		 * 矩形左上角的 x 坐标
		 */
		public function get left() : Number
		{
			return x - m_width / 2;
		}
		
		public function set left(value : Number) : void
		{
			x = value + m_width / 2;
		}
		
		/**
		 * 矩形左上角的 y 坐标
		 */
		public function get top() : Number
		{
			return y - m_height / 2;
		}
		
		public function set top(value : Number) : void
		{
			y = value + m_height / 2;
		}
		
		/**
		 * 右下角 x 坐标
		 */
		public function get right() : Number
		{
			return x + m_width / 2;
		}
		
		public function set right(value : Number) : void
		{
			x = value - m_width / 2;
		}
		
		/**
		 * 右下角 y 坐标
		 */
		public function get bottom() : Number
		{
			return y + m_height / 2;
		}
		
		public function set bottom(value : Number) : void
		{
			y = value - m_height / 2;
		}
	
		/**
		 * 外切圆半径
		 */
		public function get excircleRadius() : Number
		{
			return Math.sqrt(excircleRadiusSQ);
		}
		
		/**
		 * 外切圆半径的平方
		 */
		public function get excircleRadiusSQ() : Number
		{
			var halfW : Number = m_width / 2;
			var halfH : Number = m_height / 2;
			
			return halfW * halfW + halfH * halfH;
		}
		
		/**
		 * 克隆一个副本
		 */
		public function clone() : KRectangle
		{
			return new KRectangle(m_x, m_y, m_width, m_height);
		}
		
		/**
		 * 绘制矩形图像
		 */ 
		public function draw(graphics : Graphics,
							thickness : Number = 0, lineColor : uint = 0x000000,
							isFill : Boolean = false, fillColor : uint = 0x000000) : void
		{
			graphics.lineStyle(thickness, lineColor);
			
			if (isFill)
			{
				graphics.beginFill(fillColor);
				graphics.drawRect(left, top, width, height);
				graphics.endFill();
			}
			else
			{
				graphics.drawRect(left, top, width, height);
			}
		}
		
		public function toString() : String
		{
			var str : String = "KRectangle: [x=" + m_x + ", y=" + m_y + ", width=" + m_width + ", height=" + m_height + "]";
			return str;
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 私有类
///////////////////////////////////////////////////////////////////////////////////////////////////
	
		private var m_x : Number = NaN;
		private var m_y : Number = NaN;
		private var m_width : Number = NaN;
		private var m_height : Number = NaN;
	}

}

































///////////////////////////////////////////////////////////////////////////////////////////////////
// end file


